package top.jacktgq.itheima.netty.sticking_wrapping.resolve.lengthField;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

import java.nio.charset.StandardCharsets;

/**
 * @Author CandyWall
 * @Date 2021/3/23--22:07
 * @Description
 */
public class TestLengthFieldDecoder {
    public static void main(String[] args) {
        EmbeddedChannel embeddedChannel = new EmbeddedChannel(
                // maxFrameLength 帧的最大长度
                // lengthFieldOffset 长度字段偏移量为0，长度字段从第一个字节开始存放
                // lengthFieldLength 记录长度的字段 的长度，占4位
                // lengthAdjustment 长度字段为基准，还有几个额外字节是内容，这里额外有一位版本号
                // initialBytesToStrip 从头剥离5个字节，第0-4位是长度，第5位是版本号，如果不想解析到内容中可以都去掉
                new LengthFieldBasedFrameDecoder(1024, 0, 4, 1, 5),
                new LoggingHandler(LogLevel.DEBUG)
        );


        // 4个字节的内容长度，实际内容
        ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer();
        send(buffer, "Hello, world");
        send(buffer, "Hi!");
        send(buffer, "Candywall");

        embeddedChannel.writeInbound(buffer);
    }

    private static void send(ByteBuf buffer, String content) {
        byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
        int length = bytes.length;
        buffer.writeInt(length);
        // 版本号多占用一位
        buffer.writeByte(5);
        buffer.writeBytes(bytes);
    }
}
